// 本文件实现CanBePrefix组件
// @Author: zhengqi Wu
// @Description:
// @Version: 1.0.0
// @Date: 2021/3/9 20:55
// @Copyright: MIN-Group；国家重大科技基础设施——未来网络北大实验室；深圳市信息论与未来网络重点实验室
//

const encoding = require('../encoding')
var {InitialAble,TlvComponentBase} = require('./TlvComponentBase')
var aggregation = require('../common/aggregation')//实现了多继承

class CanBePrefix extends aggregation(TlvComponentBase,InitialAble,encoding.SelfEncodingBase){
    constructor() {
        super();
        this.canBePrefix = false;
    }

    setCanBePrefix(canBePrefix)
    {
        this.canBePrefix = canBePrefix
        this.doInitial()
    }

    getCanBePrefix()
    {
        return this.canBePrefix
    }

    /**
     * @description 将 CanBePrefix 线速编码为一个 TLV
     * @param enc {encoding.Encoder}
     * @returns 编码长度 {number}
     */
    wireEncode(enc){
        // 这是一个存在性组件，所以如果值为false，则无需编码
        if(!this.canBePrefix){
            return 0
        }

        let totalLength = 0
        try{
            // 编码TLV-LENGTH
            let tmpLen = enc.prependVarNumber((totalLength))
            // DONE 错误处理
            totalLength += tmpLen

            // 编码 TLV-TYPE
            tmpLen = enc.prependVarNumber((encoding.tlv.ComponentType.TlvCanBePrefix))
            // DONE 错误处理
            totalLength += tmpLen

            return totalLength
        }catch (e){
            throw e
        }
    }

    /**
     * @description 从 TLV Block 中解码一个 CanBePrefix
     * @param block {encoding.block.Block}
     */
    wireDecode(block){
        try {
            // 检查type是否正确,不正确的话会丢出错误
            encoding.tlv.expectType(block.getType(), encoding.tlv.ComponentType.TlvCanBePrefix)

            this.canBePrefix = true
        } catch (error) {
            throw error
        }

    }
}

module.exports = {
    CanBePrefix:CanBePrefix
}